<?php
/**
 * 入力値バリデータクラス
 * validate
 * 現状は未入力値をチェックするのみ。
 */

class Validate {

	/**
	 * バリデート元のデータを代入するプロパティ
	 */
	public $SrcData;

	/**
	 * バリデート後のデータを代入するプロパティ
	 */
	public $DstData;

	/**
	 * バリデートルールを代入するプロパティ
	 */
	private $Rules;

	/**
	 * エラーメッセージを代入するプロパティ
	 */
	public $ErrMsg;

	/**
	 * ルール初期化済みフラグ
	 */
	private $flg_initRules;

	/**
	 * コンストラクタ
	 */
	public function __construct () {
		$this->SrcData = array ();
		$this->DstData = array ();

		$this->Rules = array ();
		$this->flg_initRules = false;

		$this->ErrMsg = array ();
	}

	/**
	 * init 何もしない
	 */
	public function init () {
		return;
	}

	/**
	 * call バリデートルールの初期化
	 * 引数にバリデートルールを配列で指定する
	 */
	public function call ($Rules) {
		if ($this->Rules) return true;
		
		// ルールをすべて破棄
		$this->Rules = array ();
		
		foreach ((array)$Rules as $Key=>$Rule) {
			$this->addRule ($Key, $Rule);
		}
		Y('Logger.Debug', count($this->Rules) . ' 個のルールで初期化');

		Y('this.Rule+', YuTori::create($this, 'getRule'));
		Y('this.Add+', YuTori::create($this, 'addRule'));
		Y('this.Exec+', YuTori::create($this, 'execute'));
		Y('this.getError+', YuTori::create($this, 'getErrMsgString'));
		Y('this.Dst+', YuTori::create($this, 'getDstData'));

		return true;
	}

	/**
	 * ルールを追加する
	 */
	function addRule ($Name, $Rule) {
		$this->Rules[$Name] = $Rule;
		return true;
	}

	/**
	 * ルールを返す
	 */
	function getRule ($Name = null) {
		if (!$this->Rules) $this->initRules();

		if ($Name == null) return $this->Rules;

		if (isset($this->Rules[$Name])) return $this->Rules[$Name];
		else return false;
	}

	/**
	 * 入力値チェック実行
	 */
	function execute ($inputData) {
		$this->SrcData = $inputData;
		$this->DstData = array ();
		$this->ErrMsg = array ();

		foreach ($this->Rules as $key=>$Rule) {
			Y('Logger.Debug', '比較開始['.$key . '('.$Rule['type'].')] '.@$this->SrcData[$key]);
			if (!strcasecmp ($Rule['type'], 'no')) continue;

			$Class = 'validate_check_'.strtolower($Rule['type']);
			if (file_exists(dirname(__FILE__).'/rules/'.$Class.'.class.php')) {
				include_once (dirname(__FILE__).'/rules/'.$Class.'.class.php');
				$RuleClass = new $Class ($key, $Rule, $this);
				$RuleClass->Call();
			} else {
				Y('Logger.Debug', '不明なルールセット: '.$Rule['type']);
			}
		}
		
		Y('Logger.Debug', 'バリデート結果: '.count($this->DstData) . ' 個のデータを作成');
		
		return $this->DstData;
	}

	/**
	 * エラーを文字列で受け取る
	 */
	function getErrMsgString () {
		if (empty($this->ErrMsg)) {
			Y('Logger.Debug', 'エラーなし');
			return false;
		}
		Y('Logger.Debug', 'エラーあり');
		return implode ("\n", $this->ErrMsg);
	}

	/**
	 * バリデート済みデータの取得
	 */
	function getDstData () {
		if (empty($this->DstData)) {
			 return false;
		}
		return $this->DstData;
	}
}
?>